package game.mapa;

import game.entidades.Elemento;
import java.awt.Image;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * Representa o mapa do arquivo txt em forma  de uma matriz de imagens.
 * Possui uma lista de elementos que estão sendo visualizados na tela.
 * @author LeandroBeni e DeboraGonçalves
 */
public class Mapa {

    private Image[][] mapa;
    private List< Elemento > elementos;

    /**
     * Construtor que inicializa o mapa.
     * @param nLinha numero de linhas que o mapa possui no arquivo txt.
     * @param nColuna numero de colunas que o mapa possui no arquivo txt.
     */
    public Mapa( int nLinha, int nColuna ) {
        mapa = new Image[ nLinha ][ nColuna ];
        elementos = new LinkedList<Elemento>();
    }

    /**
     * Retorna o numero de linhas que o mapa possui.
     * @return retorna o numero de linhas.
     */
    public int getNumLinha() {
        return mapa.length;
    }

    /**
     * Retorna o numero de colunas que o mapa possui.
     * @return retorna o numero de colunas.
     */
    public int getNumColuna() {
        return mapa[ 0 ].length;
    }

    /**
     * Pega a imagem de uma determinada posição do mapa.
     * @param x numero de linhas.
     * @param y numero de colunas.
     * @return a imagem que esta em determinada posição(x,y).
     */
    public Image getPosicao( int x, int y ) {
        if ( y < 0 || y >= getNumColuna() ||
                x < 0 || x >= getNumLinha() ) {
            return null;
        } else {
            return mapa[ x ][ y ];
        }
    }
    /**
     * Modifica a imagem de uma determinada posição.
     * @param x numero de linhas.
     * @param y numero de colunas.
     * @param imagem imagem que ira colocar na posição(x,y).
     */
    public void setPosicao( int x, int y, Image imagem ) {
        mapa[ x ][ y ] = imagem;
    }

    /**
     * Adiciona um elemento na lista de elementos.
     * @param elemento elemento a ser adicionado.
     */
    public void addElemento( Elemento elemento ) {
        elementos.add( elemento );
    }

    /**
     * Remove um elemento da lista de elementos.
     * @param elemento elemento a ser removido.
     */
    public void removeElemento( Elemento elemento ) {
        elementos.remove( elemento );
    }

    /**
     * Retorna o iterator da lista de elementos.
     * @return retorna o iterator.
     */
     public Iterator getElementos() {
        return elementos.iterator();
    }

}